﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Reflection;

namespace DCMS_Framework {
  public class PropertyComparer<T> : IComparer<T> {
    private readonly IComparer comparer;
    private PropertyDescriptor propertyDescriptor;
    private int reverse;

    public PropertyComparer( PropertyDescriptor property, ListSortDirection direction ) {
      this.propertyDescriptor = property;
      Type comparerForPropertyType = typeof( Comparer<> ).MakeGenericType( property.PropertyType );
      this.comparer = ( IComparer ) comparerForPropertyType.InvokeMember( "Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null );
      this.SetListSortDirection( direction );
    }

    #region IComparer<T> Members

    public int Compare( T x, T y ) {
      return this.reverse * this.comparer.Compare( this.propertyDescriptor.GetValue( x ), this.propertyDescriptor.GetValue( y ) );
    }

    #endregion

    private void SetPropertyDescriptor( PropertyDescriptor descriptor ) {
      this.propertyDescriptor = descriptor;
    }

    private void SetListSortDirection( ListSortDirection direction ) {
      this.reverse = direction == ListSortDirection.Ascending ? 1 : -1;
    }

    public void SetPropertyAndDirection( PropertyDescriptor descriptor, ListSortDirection direction ) {
      this.SetPropertyDescriptor( descriptor );
      this.SetListSortDirection( direction );
    }
  }
}
